const Service = require('egg').Service;
const bcrypt = require('bcryptjs') //密码加密
const { error, success } = require('../utils/response.js')

class UserService extends Service {
    async check(ctx) {
      const token = ctx.request.header.authorization;
      const userInfo = ctx.app.jwt.verify(token, ctx.app.config.jwt.secret);
      success(ctx,'获取成功',userInfo)
    }
    // 登录功能
    async login(userInfo,ctx){
        // 首先验证是否存在该用户
        const user = await this.app.mysql.get('user', { username:userInfo.username });
        if(!user) return error(ctx,'不存在该用户！')
        // 判断密码是否正确
        const compareResult = bcrypt.compareSync(userInfo.password, user.password);
        if(!compareResult) return error(ctx,'密码错误!')
        //生成token返回信息
        delete user.password;
        const token = ctx.app.jwt.sign({...user,id:user.id},this.app.config.jwt.secret,{expiresIn: '60m'})
        success(ctx,'登录成功',{token,...user});
    }
    async sign(userInfo,ctx){
      // 首先验证是否存在该用户
      const user = await this.app.mysql.get('user', { username:userInfo.username});
      if(user) return error(ctx,'已存在该用户名！')
      // 加密密码
      userInfo.password = bcrypt.hashSync(userInfo.password, 10)
      const res = await this.app.mysql.insert('user',{...userInfo});
      if(res.affectedRows !== 1) return error(ctx,'注册失败!');
      //注册用户时需要用户喜欢表
      const newUser = await this.app.mysql.get('user', { username:userInfo.username });
      const res1 = await this.app.mysql.insert('userlike',{userId:newUser.id});
      if(res1.affectedRows !== 1) return error(ctx,'添加用户喜欢列表失败!');
      success(ctx,'注册成功');
    }
    async page(info,ctx){
      // info中包含name和status limit和page
      // 只有status为超管(3)的才能获取这个接口
      const token = ctx.request.header.authorization;
      const userInfo = ctx.app.jwt.verify(token, ctx.app.config.jwt.secret);
      if(userInfo.status !== 2 ) return error(ctx,'没有该接口的权限')
      const limit = info.limit || 8;
      const page = info.page || 1;
      let {name,status} = info;
      if(name === '') name = null;
      if(status === '') status = null;
      const res = await this.app.mysql.query(`select * from user where (status = ? or ? is null) and (username like concat('%',?,'%') or ? is null) limit ? offset ?`,[status,status,name,name, Number(limit), (page - 1) * limit]);
      // 获取总页数
      const resTotal = await this.app.mysql.query(`select count(id) from user where (status = ? or ? is null) and (username like concat('%',?,'%') or ? is null)`, [status, status, name, name]);
      const totalPage = Math.ceil(resTotal[0]['count(id)'] / limit)
      success(ctx, '获取成功', { totalPage, currentPage: Number(page), total: resTotal[0]['count(id)'], data: res })
    }
    async addUser(info,ctx){
      // 只有status为超管(3)的才能获取这个接口
      const token = ctx.request.header.authorization;
      const userInfo = ctx.app.jwt.verify(token, ctx.app.config.jwt.secret);
      if(userInfo.status !== 2 ) return error(ctx,'没有该接口的权限')
      // 首先验证是否存在该用户
      const user = await this.app.mysql.get('user', { username:info.username});
      if(user) return error(ctx,'已存在该用户名！')
      // 加密密码
      info.password = bcrypt.hashSync(info.password, 10)
      const res = await this.app.mysql.insert('user',{...info});
      if(res.affectedRows !== 1) return error(ctx,'添加用户失败!');
      success(ctx,'添加用户成功');
    }
    async updateUser(info,ctx){
      // 只有status为超管(3)的才能获取这个接口
      const token = ctx.request.header.authorization;
      const userInfo = ctx.app.jwt.verify(token, ctx.app.config.jwt.secret);
      if(userInfo.status !== 2 ) return error(ctx,'没有该接口的权限')
      // 首先验证是否存在该用户
      const user = await this.app.mysql.get('user', { id:info.id});
      if(!user) return error(ctx,'不存在该用户！')
      // 如果存在密码 加密密码
      if(info.password){
        info.password = bcrypt.hashSync(info.password, 10)
      }else{
        delete info.password
      }
      const res = await this.app.mysql.update('user',{...info});
      if(res.affectedRows !== 1) return error(ctx,'更新用户信息失败!');
      success(ctx,'更新用户信息成功');
    }
    async deleteUser(info,ctx){
      // 只有status为超管(3)的才能获取这个接口
      const token = ctx.request.header.authorization;
      const userInfo = ctx.app.jwt.verify(token, ctx.app.config.jwt.secret);
      if(userInfo.status !== 2 ) return error(ctx,'没有该接口的权限')
      const {id} = info
      const res = await this.app.mysql.delete('user',{id});
      if(res.affectedRows !== 1) error(ctx, '删除用户！请检查后台服务')
      success(ctx, '删除成功')
    }
    async updateSelf(info,ctx){
      // 获取个人信息用于更新头像
      const token = ctx.request.header.authorization;
      const userInfo = ctx.app.jwt.verify(token, ctx.app.config.jwt.secret);
      console.log(userInfo);
      // 如果更新了密码
      if(info.password){
        // 先比较老密码是否正确
        const user = await this.app.mysql.get('user', { id:userInfo.id});
        const compareResult = bcrypt.compareSync(info.oldPassword, user.password);
        if(!compareResult) return error(ctx,'输入的原密码错误')
        info.password = bcrypt.hashSync(info.password, 10)
      }
      // 如果存在用户名，则需要对数据库用户名进行查重
      if(info.username){
        const user = await this.app.mysql.get('user', { username:info.username});
        if(user && user.id !== userInfo.id) return error(ctx,'已存在该用户名！')
      }
      delete info.oldPassword;
      const res = await this.app.mysql.update('user',{...info,id:userInfo.id})
      if(res.affectedRows !== 1) error(ctx, '更新头像失败！请检查后台服务')
      // 更新成功，生成token
      const newUser = await this.app.mysql.get('user', { id:userInfo.id });
      delete newUser.password;
      const newToken = ctx.app.jwt.sign({...newUser},this.app.config.jwt.secret,{expiresIn: '60m'})
        success(ctx,'更新成功',{token:newToken,...newUser});
    }
  }
module.exports = UserService;